package com.spring.format.code.generation.util.file;

import java.util.Date;
import java.util.List;

import com.spring.format.code.generation.constants.Constants;
import com.spring.format.code.generation.constants.FileNameEnumType;
import com.spring.format.code.generation.mybatis.po.TablePO;
import com.spring.format.code.generation.mybatis.vo.CreateFileVO;
import com.spring.format.code.generation.mybatis.vo.JavaAttributeVO;
import com.spring.format.code.generation.util.CommonCodeUtil;
import com.spring.format.code.generation.util.FieldUtil;
import com.spring.format.code.generation.util.NameUtil;
import com.spring.format.code.generation.util.PathUtil;

/**
 * 文件生成帮助类
 * 
 * @author lenovo
 *
 */
public class ShopServiceApiFileUtil {
	private ShopServiceApiFileUtil() {

	}

	public static String content(CreateFileVO fileVO) {

		TablePO tablePO = fileVO.getTablePO();
		List<JavaAttributeVO> attrVOList = fileVO.getAttrVOList();
		// vo的类名
		String voName = NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.VO_NAME);

		StringBuilder attribute = new StringBuilder();
		attribute.append(head(tablePO));

		StringBuilder methodStr = new StringBuilder();
		// 增加数据
		methodStr.append(add(voName));
		// 批量增加数据
		methodStr.append(addBatch(voName));
		// 删除数据
		methodStr.append(deleteById());
		// 修改数据
		methodStr.append(update(voName));
		// 根据id查询
		methodStr.append(queryById(voName));
		// 查询分页
		methodStr.append(page(voName));
		// 更改数据状态
		// methodStr.append(editStatusBatch());
		// 根据or条件获取唯一数据
		// methodStr.append(uniqueByOr(voName));
		// 根据or条件获取数据集合
		// methodStr.append(queryListByOr(voName));
		// 更改数据状态
		methodStr.append(editStatus());
		// 取数据集合
		methodStr.append(queryList(voName));
		for (JavaAttributeVO attriVO : attrVOList) {
			// 特殊字段，特殊方法的追加代码(如排序字段，唯一索引字段，有自己方法的字段)
			methodStr.append(specialFieldAddition(attriVO, voName));
		}

		attribute.append(methodStr).append(CommonCodeUtil.methodEnd(" //end class "));

		return attribute.toString();

	}

	/** 特殊字段需要特殊的方法追加 **/
	public static String specialFieldAddition(JavaAttributeVO attriVO, String voName) {
		StringBuilder specialFieldAddition = new StringBuilder();
		/** 自己更新方法 **/
		if (FieldUtil.getHaveselfupdatefieldlist().indexOf(attriVO.getName()) >= 0) {
			specialFieldAddition.append(update(voName, NameUtil.updateName(attriVO.getName())));
		}
		// 是否有唯一索引（未完成，有唯一索引的字段可以生成自己的方法，如：id，不过字段索引属性，在数据库里面很复杂，这里就不再实现了）
		return specialFieldAddition.toString();
	}

	/** 文件头部 **/
	public static String head(TablePO tablePO) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append("package ")
				.append(PathUtil.createPackagePath(tablePO.getTable_name(), FileNameEnumType.SERVICE_API_NAME))
				.append("/**\n").append("  *").append(tablePO.getTable_comment()).append("\n").append("  *@author ")
				.append(System.getProperties().getProperty("user.name")).append("\n").append("  *@version 1.0.0 ")
				.append(DateUtil.dateFormat(new Date(), DateUtil.DATE_FORMAT)).append(" \n").append("  */\n")
				.append("public interface ")
				.append(NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.SERVICE_API_NAME))
				.append("  { \n");

		return methodStr.toString();
	}

	/** 更改数据状态 **/
	public static String editStatus() {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据id 更改数据状态")).append(CommonCodeUtil.apiMethodResult("?", null,
				Constants.DAO_METHOD_EDIT_STATUS, "Integer status,Integer id"));
		return methodStr.toString();
	}

	/** 新增 **/
	public static String add(String voName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("增加数据")).append(
				CommonCodeUtil.apiMethodResult("vo", voName, Constants.DAO_METHOD_INSERT, voName + " paramVO "));
		return methodStr.toString();
	}

	/** 批量新增 **/
	public static String addBatch(String voName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("批量增加数据")).append(CommonCodeUtil.apiMethodResult("?", voName,
				Constants.DAO_METHOD_INSERT_BATCH, "List<" + voName + "> paramVOList "));
		return methodStr.toString();
	}

	/** 删除数据 **/
	public static String deleteById() {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据id删除数据"))
				.append(CommonCodeUtil.apiMethodResult("?", null, Constants.DAO_METHOD_DELETE_BY_ID, " Integer id "));
		return methodStr.toString();
	}

	/** 修改数据 **/
	public static String update(String voName) {
		return update(voName, Constants.DAO_METHOD_UPDATE);
	}

	/** 修改数据 **/
	public static String update(String voName, String methodName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("更新数据信息"))
				.append(CommonCodeUtil.apiMethodResult("?", null, methodName, voName + " paramVO "));
		return methodStr.toString();
	}

	/** 根据id查询 **/
	public static String queryById(String voName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据id查询数据"))
				.append(CommonCodeUtil.apiMethodResult("vo", voName, Constants.DAO_METHOD_QUERY_BY_ID, " Integer id "));
		return methodStr.toString();
	}

	/** 查询分页 **/
	public static String page(String voName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("查询分页")).append(
				CommonCodeUtil.apiMethodResult("list", voName, Constants.DAO_METHOD_QUERY_PAGE, voName + " paramVO "));
		return methodStr.toString();
	}

	/** 批量更改数据状态 **/
	public static String editStatusBatch() {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("根据ids 更改数据状态")).append(CommonCodeUtil.apiMethodResult("?", null,
				Constants.DAO_METHOD_EDIT_STATUS_BATCH, " Integer state,Integer[] ids "));
		return methodStr.toString();
	}

	/** 根据or条件获取唯一数据 **/
	public static String uniqueByOr(String voName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("7  根据or条件获取唯一数据 ")).append(CommonCodeUtil.apiMethodResult("vo",
				voName, Constants.DAO_METHOD_QUERY_UNIQUE_BY_OR, voName + " paramVO "));
		return methodStr.toString();
	}

	/** 根据or条件获取数据集合 **/
	public static String queryListByOr(String voName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("8 根据 or 条件获取数据集合")).append(CommonCodeUtil.apiMethodResult("list",
				voName, Constants.DAO_METHOD_QUERY_LIST_BY_OR, voName + " paramVO "));
		return methodStr.toString();
	}

	/** 根据条件查询列表数据 **/
	public static String queryList(String voName) {
		StringBuilder methodStr = new StringBuilder();
		methodStr.append(CommonCodeUtil.methodRemark("10 获取数据集合")).append(CommonCodeUtil.apiMethodResult("list", voName,
				Constants.SERVICE_METHOD_QUERY_LIST, voName + " paramVO "));
		return methodStr.toString();
	}
}
